package com.aop;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class MethodExecutionContext {

    // 使用 Stack 来保存当前调用链中的方法 ID
    private static ThreadLocal<Stack<String>> methodIdStack = ThreadLocal.withInitial(Stack::new);

    // 设置当前方法的 ID，并记录上一个方法 ID
    public static void setMethodId(String methodId) {
        Stack<String> stack = methodIdStack.get();
        if (!stack.isEmpty()) {
            String prevMethodId = stack.peek(); // 获取上一个方法的 ID
            // 存储上一个方法 ID（在切面中可以使用）
            // 将当前方法 ID 入栈，表示当前方法的调用
            stack.push(methodId);
        } else {
            // 如果是第一次方法调用，将其作为唯一的 methodId
            stack.push(methodId);
        }
    }

    // 获取当前方法的 ID
    public static String getMethodId() {
        Stack<String> stack = methodIdStack.get();
        return stack.isEmpty() ? null : stack.peek();
    }

    // 获取上一个方法的 ID
    public static String getPreviousMethodId() {
        Stack<String> stack = methodIdStack.get();
        return stack.size() > 1 ? stack.get(stack.size() - 2) : null; // 获取栈中倒数第二个元素，即上一个方法的 ID
    }

    // 清除当前线程的调用栈
    public static void clear() {
        methodIdStack.remove();
    }

    // 生成一个基于时间戳和随机数的唯一 ID
    public static String generateUniqueId() {
        long timestamp = System.currentTimeMillis();
        int random = (int) (Math.random() * 10000); // 随机数
        return timestamp + "-" + random;
    }

    public static void enterMethod(String methodName) {
        methodIdStack.get().push(methodName);
//        System.out.println("Entering method: " + methodName);
    }

    public static void exitMethod() {
        if (!methodIdStack.get().isEmpty()) {
            String methodName = methodIdStack.get().pop();
//            System.out.println("Exiting method: " + methodName);
        }
    }

    // 获取当前调用栈
    public static List<String> getCurrentCallStack() {
        return new ArrayList<>(methodIdStack.get());
    }
}

